﻿using System;
using System.Collections.Generic;
using System.IO;
using System.IO.IsolatedStorage;
using System.Net;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Resources;
using LuyenThiVer03.DapAnWebService;
using LuyenThiVer03.GoiCauHoiWebService;
using LuyenThiVer03.UserData;
using Microsoft.Phone.Net.NetworkInformation;
using System.ServiceModel;
using Microsoft.Phone.Shell;


namespace LuyenThiVer03
{
    public partial class PageChonDe
    {
        private readonly List<MaDeThi> _listMaDe;
        private CustomBox _cusBox = new CustomBox
                                        {
                                            HasCloseButton = false
                                        };

        public int TongSoCau { get; set; }
        public int CauHoiDaLoad { get; set; }
        public int DeThiId { get; set; }
        public int ThoiGian { get; set; }
        private string ImageUrl { get; set; }
        private int MaTranKienThucId { get; set; }
        private int MonHocId { get; set; }

        public PageChonDe()
        {
            InitializeComponent();
            _listMaDe = new List<MaDeThi>();

            var wCauHinh = new CauHinhHeThongWebService.CauHinhHeThongWebServiceSoapClient();
            wCauHinh.SelectOneCompleted += wCauHinh_OnSelectOneCompleted;
            wCauHinh.SelectOneAsync(1);
        }

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            var progress = new ProgressIndicator { IsVisible = true, Text = "Đang tải ...", IsIndeterminate = true };
            SystemTray.SetProgressIndicator(this, progress);
            try
            {
                var wNhomDe = new NhomDeThiWebService.NhomDeThiWebServiceSoapClient();
                wNhomDe.SelectAllByMonHoc_IDCompleted += wNhomDe_OnSelectAllByMonHoc_IDCompleted;
                wNhomDe.SelectAllByMonHoc_IDAsync(NavigationContext.QueryString["mon"]);
            }
            catch (NetworkException)
            {
                MessageBox.Show("Dường như không thể kết nối Internet, hãy kiểm tra mạng của bạn!");
                NavigationService.GoBack();
            }
            catch (CommunicationException)
            {
                MessageBox.Show("Dường như không thể kết nối Internet, hãy kiểm tra mạng của bạn!");
                NavigationService.GoBack();
            }
            catch (TimeoutException)
            {
                MessageBox.Show("Dường như không thể kết nối Internet, hãy kiểm tra mạng của bạn!");
                NavigationService.GoBack();
            }
            catch (WebException)
            {
                MessageBox.Show("Dường như không thể kết nối Internet, hãy kiểm tra mạng của bạn!");
                NavigationService.GoBack();
            }
            catch (Exception)
            {
                MessageBox.Show("Dường như không thể kết nối Internet, hãy kiểm tra mạng của bạn!");
                NavigationService.GoBack();
            }
        }

        private void wNhomDe_OnSelectAllByMonHoc_IDCompleted(object sender, NhomDeThiWebService.SelectAllByMonHoc_IDCompletedEventArgs e)
        {
            try
            {
                var lsNhomde = new List<NhomDeThiWebService.NhomDeThiEntity>(e.Result);
                var tongSoDe = lsNhomde.Count;
                var deDaLoad = 0;
                _listMaDe.Clear();

                for (var i = 0; i < tongSoDe; i++)
                {
                    var m = new MaDeThi
                                    {
                                        SoThuTu = "" + (i + 1),
                                        NoiDung = "Đề số " + lsNhomde[i].NhomDeThi_ID,
                                        NhomDeThi_ID = lsNhomde[i].NhomDeThi_ID
                                    };
                    _listMaDe.Add(m);
                    deDaLoad++;
                }
                ListDe1.ItemsSource = _listMaDe;
                if (deDaLoad >= tongSoDe)
                {
                    SystemTray.GetProgressIndicator(this).IsVisible = false;
                }
            }
            catch (CommunicationException)
            {
                MessageBox.Show("Dường như kết nối Internet gặp vấn đề. Hãy kiểm tra mạng của bạn!");
            }
            catch (TimeoutException)
            {
                MessageBox.Show("Quá thời gian kết nối!");
            }
        }

        private void ListDe1_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (((ListBox)sender).SelectedIndex == -1)
            {
                return;
            }
            var m = (MaDeThi)e.AddedItems[0];
            ((ListBox)sender).SelectedIndex = -1;
            StartDownloadDeThi(m.NhomDeThi_ID);
        }

        private void StartDownloadDeThi(int maDe)
        {
            ((App)Application.Current).deso = maDe;
            ((App)Application.Current).DicCauHoi.Clear();
            ((App)Application.Current).DicDapAn.Clear();
            ((App)Application.Current).ListKeyCauHoi.Clear();
            ((App)Application.Current).ListDapAnDung.Clear();
            ((App)Application.Current).ListDapAnUser.Clear();
            var mesBoxResult = MessageBox.Show("Nếu chưa thật sự sẵn sàng hãy ấn Cancel!", "Sẵn sàng làm bài thi?",
                                               MessageBoxButton.OKCancel);
            if (mesBoxResult == MessageBoxResult.Cancel)
            {
                return;
            }
            LoadNhomDeThiThu(maDe);
            var progress = new ProgressIndicator { IsIndeterminate = true, IsVisible = true, Value = 30, Text = "Đang tải ..." };
            SystemTray.SetProgressIndicator(this, progress);
            _cusBox = new CustomBox
            {
                tblMonThi = { Text = "Môn thi: " + GetTenMonHoc(NavigationContext.QueryString["mon"]) },
                tblSoCau = { Text = "Số câu: " },
                tblThoiGian = { Text = "Thời gian: " }
            };
            _cusBox.Show();

        }

        private void LoadNhomDeThiThu(int maDe)
        {
            try
            {
                var nhom = new NhomDeThiGoiCauHoiWebService.NhomDeThiGoiCauHoiWebServiceSoapClient();
                nhom.SelectAllByNhomDeThi_IDCompleted += nhomDeThi_OnSelectAllByNhomDeThi_IDCompleted;
                nhom.SelectAllByNhomDeThi_IDAsync(maDe);
            }
            catch (CommunicationException)
            {
                MessageBox.Show("Dường như kết nối Internet gặp vấn đề. Hãy kiểm tra mạng của bạn!");
            }
            catch (TimeoutException)
            {
                MessageBox.Show("Quá thời gian kết nối!");
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        private void nhomDeThi_OnSelectAllByNhomDeThi_IDCompleted(object sender, NhomDeThiGoiCauHoiWebService.SelectAllByNhomDeThi_IDCompletedEventArgs e)
        {
            //thi thu

            try{

            var nhomDeThi = new List<NhomDeThiGoiCauHoiWebService.NhomDeThiGoiCauHoiEntity>(e.Result);
            TongSoCau = nhomDeThi.Count;

            //update custom box here
            _cusBox.tblSoCau.Text = "Số câu: " + Convert.ToString(TongSoCau);
            _cusBox.tblThoiGian.Text = "Thời gian: " + "60p";

            DeThiId = nhomDeThi[0].NhomDeThi_ID;
            MaTranKienThucId = nhomDeThi[0].MaTranKienThuc_ID;
            MonHocId = nhomDeThi[0].MonHoc_ID;
            foreach (var nhomDeThiGoiCauHoiEntity in nhomDeThi)
            {
                var nhomDeThi = new List<NhomDeThiGoiCauHoiWebService.NhomDeThiGoiCauHoiEntity>(e.Result);
                TongSoCau = nhomDeThi.Count;
                DeThiId = nhomDeThi[0].NhomDeThi_ID;
                MaTranKienThucId = nhomDeThi[0].MaTranKienThuc_ID;
                MonHocId = nhomDeThi[0].MonHoc_ID;
                foreach (var nhomDeThiGoiCauHoiEntity in nhomDeThi)
                {
                    ((App)Application.Current).ListKeyCauHoi.Add(nhomDeThiGoiCauHoiEntity.CauHoi_ID);
                    MaTranKienThucId = nhomDeThiGoiCauHoiEntity.MaTranKienThuc_ID;
                    LoadCauHoiThiThu(nhomDeThiGoiCauHoiEntity.CauHoi_ID);
                }
                var deThi = new DeThi
                {
                    DeThiID = DeThiId,
                    MonHocID = MonHocId,
                    MaTranKienThucID = MaTranKienThucId,
                    IsDelete = false,
                    IsDownload = true,
                    Time = "60"
                };
                DBHelper.InsertDeThi(deThi);
            }
            catch (Exception)
            {
                MessageBox.Show("Có thể đã có lỗi trong quá trình tải đề thi, hãy thử lại!");
            }
        }

        private void LoadCauHoiThiThu(long cauHoiId)
        {
            //thi thu
            try
            {
                var cauHoiWebServiceSoapClient = new GoiCauHoiWebServiceSoapClient();
                cauHoiWebServiceSoapClient.SelectByIdCompleted += goiCauHoi_OnSelectByIdCompleted;
                cauHoiWebServiceSoapClient.SelectByIdAsync(cauHoiId);
            }
            catch (CommunicationException)
            {
                MessageBox.Show("Dường như kết nối Internet gặp vấn đề. Hãy kiểm tra mạng của bạn!");
            }
            catch (TimeoutException)
            {
                MessageBox.Show("Quá thời gian kết nối!");
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        private void goiCauHoi_OnSelectByIdCompleted(object sender, GoiCauHoiWebService.SelectByIdCompletedEventArgs e)
        {
            //thi thu
            try
            {
                if (e.Result == null)
                {
                    //MessageBox.Show("Đề thi hiện tại không có dữ liệu. Mời bạn chọn đề khác.");
                    NavigationService.Navigate(new Uri("/PageChonDe.xaml", UriKind.Relative));
                    return;
                }
                var cauHoi = e.Result;
                ThoiGian = cauHoi.ThoiGian;
                ((App)Application.Current).DicCauHoi.Add(cauHoi.CauHoi_ID, cauHoi.NoiDung);
                var dbCauHoi = new CauHoi
                                   {
                                       CauHoiID = cauHoi.CauHoi_ID,
                                       NoiDung = cauHoi.NoiDung,
                                       MoTa = cauHoi.MoTa,
                                       MaTranKienThucID = cauHoi.MaTranKienThuc_ID
                                   };
                DBHelper.InsertCauHoi(dbCauHoi);
                var deThiCauHoi = new DeThiCauHoi
                {
                    DeThiID = DeThiId,
                    CauHoiID = cauHoi.CauHoi_ID,
                    MaTranKienThucID = MaTranKienThucId,
                    MonHocID = MonHocId
                };
                DBHelper.InsertDeThiCauHoi(deThiCauHoi);

                LoadDapAnMotCauHoi(cauHoi.CauHoi_ID);
            }
            catch (NullReferenceException)
            {
                //MessageBox.Show("Có thể nội dung đề thi bị lỗi, hãy chọn đề khác!");
                _cusBox.Close();
                SystemTray.GetProgressIndicator(this).IsVisible = false;
            }
        }

        private void LoadDapAnMotCauHoi(long cauHoiId)
        {
            //thi thu + on thi
            try
            {
                var dapAnWebServiceSoapClient = new DapAnWebServiceSoapClient();
                dapAnWebServiceSoapClient.SelectAllByCauHoi_IDCompleted += DapAnWebSv_OnSelectAllByCauHoi_IDCompleted;
                dapAnWebServiceSoapClient.SelectAllByCauHoi_IDAsync(cauHoiId);
            }
            catch (CommunicationException)
            {
                MessageBox.Show("Dường như kết nối Internet gặp vấn đề. Hãy kiểm tra mạng của bạn!");
            }
            catch (TimeoutException)
            {
                MessageBox.Show("Quá thời gian kết nối!");
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        private void DapAnWebSv_OnSelectAllByCauHoi_IDCompleted(object sender, SelectAllByCauHoi_IDCompletedEventArgs e)
        {
            //thi thu 
            var result = new List<DapAnEntity>(e.Result);
            var arrayDapAn = new List<string>();
            for (var i = 0; i < result.Count; i++)
            {
                //luu 1 dap an vao database
                var dbDapAn = new DapAn
                    {
                        CauHoiID = result[i].CauHoi_ID,
                        DapAnID = result[i].DapAn_ID,
                        NoiDung = result[i].NoiDung,
                        IsRightAnswer = result[i].IsDapAnDung,
                        MaTranKienThucID = result[i].MaTranKienThuc_ID
                    };
                DBHelper.InsertDapAn(dbDapAn);


                //them noi dung dap an de thi thu
                arrayDapAn.Add(result[i].NoiDung);
                if (result[i].IsDapAnDung)
                {
                    ((App)Application.Current).ListDapAnDung.Add(i);
                }
            }
            //((App) Application.Current).DicKeyDapAn.Add(result[0].CauHoi_ID, arrayKeyDapAn);
            ((App)Application.Current).DicDapAn.Add(result[0].CauHoi_ID, arrayDapAn);
            ((App)Application.Current).ListDapAnUser.Add(new PageLamBaiTracNghiem.DapAnUser(10));
            CauHoiDaLoad++;

            this.Dispatcher.BeginInvoke(() => updateUICustomBox());
        }

        private void updateUICustomBox()
        {          
            _cusBox.progressBar.Value += 2;
            _cusBox.tblDangTai.Text = (CauHoiDaLoad * 100) / TongSoCau + " %";
            if (CauHoiDaLoad < TongSoCau) return;
            SystemTray.GetProgressIndicator(this).IsVisible = false;            
            _cusBox.progressBar.Maximum = TongSoCau;
            _cusBox.btBatDau.Visibility = Visibility.Visible;
            _cusBox.btBatDau.Click += btBatDau_OnClick;
        }

        private void wCauHinh_OnSelectOneCompleted(object sender, CauHinhHeThongWebService.SelectOneCompletedEventArgs e)
        {
            try
            {
                ImageUrl = e.Result.DuongDanWeb;
            }
            catch (TimeoutException te)
            {
                MessageBox.Show("Bạn vui lòng kiểm tra lại kết nối mạng.");
            }
        }

        private void LoadImageFromHeThong(string imageUrl)
        {
            var webClient = new WebClient();
            webClient.OpenReadCompleted += webClient_OnOpenReadCompleted;
            webClient.OpenReadAsync(new Uri(imageUrl), webClient);
        }

        private void webClient_OnOpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            var resInfo = new StreamResourceInfo(e.Result, null);
            var reader = new StreamReader(resInfo.Stream);
            byte[] contents;
            using (var binaryReader = new BinaryReader(reader.BaseStream))
            {
                contents = binaryReader.ReadBytes((int)reader.BaseStream.Length);
            }
            var file = IsolatedStorageFile.GetUserStoreForApplication();
            var stream = file.CreateFile(@"\CongThuc\image" + CauHoiDaLoad + ".jpg");
            stream.Write(contents, 0, contents.Length);
            stream.Close();
        }

        private void btBatDau_OnClick(object sender, RoutedEventArgs e)
        {
            _cusBox.Close();
            NavigationService.Navigate(new Uri("/PageLamBaiTracNghiem.xaml?kieuthi=thithu&tongsocau=" + CauHoiDaLoad + "&MTKT=" + MaTranKienThucId, UriKind.Relative));
        }

        private string GetTenMonHoc(string maMonHoc)
        {
            var tenMonHoc = "";
            switch (maMonHoc)
            {
                case "76":
                    tenMonHoc = "Lý";
                    break;
                case "75":
                    tenMonHoc = "Hóa";
                    break;
                case "61":
                    tenMonHoc = "Anh";
                    break;
                case "74":
                    tenMonHoc = "Sinh";
                    break;
            }
            return tenMonHoc;
        }

        private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject
        {
            var count = VisualTreeHelper.GetChildrenCount(parentElement);
            if (count == 0)
                return null;

            for (var i = 0; i < count; i++)
            {
                var child = VisualTreeHelper.GetChild(parentElement, i);

                if (child is T)
                {
                    return (T)child;
                }
                var result = FindFirstElementInVisualTree<T>(child);
                if (result != null)
                    return result;
            }
            return null;
        }

        private void btLamNgay_OnClick(object sender, RoutedEventArgs e)
        {
            int maDe;
            if (GetMaDeThiFromTextBlock(out maDe)) return;
            StartDownloadDeThi(maDe);
        }

        private bool GetMaDeThiFromTextBlock(out int maDe)
        {
            if (ListDe1.ItemContainerGenerator == null)
            {
                maDe = 0;
                return true;
            }
            var item = ListDe1.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
            var firstContextMenu = FindFirstElementInVisualTree<TextBox>(item);
            maDe = int.Parse(firstContextMenu.Text);
            return false;
        }

        private void btTaiVe_OnClick(object sender, RoutedEventArgs e)
        {
            int maDe;
            if (GetMaDeThiFromTextBlock(out maDe)) return;
            ((App)Application.Current).DicCauHoi.Clear();
            ((App)Application.Current).DicDapAn.Clear();
            ((App)Application.Current).ListKeyCauHoi.Clear();
            ((App)Application.Current).ListDapAnDung.Clear();
            ((App)Application.Current).ListDapAnUser.Clear();
            LoadNhomDeThiThu(maDe);
            var progress = new ProgressIndicator { IsIndeterminate = true, IsVisible = true, Value = 30, Text = "Đang tải ..." };
            SystemTray.SetProgressIndicator(this, progress);
            _cusBox = new CustomBox
            {
                tblMonThi = { Text = "Môn thi: " + GetTenMonHoc(NavigationContext.QueryString["mon"]) },
                tblSoCau = { Text = "Số câu: " },
                tblThoiGian = { Text = "Thời gian: " }
            };
            _cusBox.Show();
        }
    }
}